<?php
namespace app\common\validate;

use app\common\exception\ParameterException;
use think\facade\Request;
use think\Validate;
use think\facade\Config;

/**
 * Class BaseValidate
 * 验证类的基类
 */
class BaseValidate extends Validate {

    protected $batch = true;

    protected $regex = [
        'mobile' => '^[1][3,4,5,7,8][0-9]{9}$',
        "ids" => "/([0-9]+){1,}/"
    ];
    public function __construct(){
        parent::__construct();
    }

    /**
     * 检测所有客户端发来的参数是否符合验证类规则
     * @return mixed
     * @throws ParameterException
     */
    public function goCheck() {
        $params = Request::param();
        if (!$this->check($params))
        {
            throw  new ParameterException([
                'msg' => is_array($this->error) ? implode('；', $this->error) : $this->error,
            ]);
        }
        if (array_key_exists('user',$params)) {
            unset($params['user']);
        }
        if (array_key_exists('version',$params)) {
            unset($params['version']);
        }
        return $params;
    }

    /**
     * @param array $arrays 通常传入request.post变量数组
     * @return array 按照规则key过滤后的变量数组
     * @throws ParameterException
     */
    public function getDataByRule($arrays)
    {
        if (array_key_exists('user_id', $arrays) | array_key_exists('uid', $arrays))
        {
            // 不允许包含user_id或者uid，防止恶意覆盖user_id外键
            throw new ParameterException([
                'msg' => '参数中包含有非法的参数名user_id或者uid'
            ]);
        }
        $newArray = [];
        foreach ($this->rule as $key => $value)
        {
            $newArray[$key] = $arrays[$key];
        }
        return $newArray;
    }


    /**
     * 正整数检测
     * @Author   zhua
     * @DateTime 2018-08-25T14:49:17+0800
     * @param    [type]                   $value [description]
     * @param    string                   $rule  [description]
     * @param    string                   $data  [description]
     * @param    string                   $field [description]
     * @return   boolean                         [description]
     */
    protected function isPositiveInteger($value, $rule='', $data='', $field='')
    {
        if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0) {
            return true;
        }
        return $field . '必须是正整数';
    }

    /**
     * 不能为空参数字段检测
     * @Author   zhua
     * @DateTime 2018-08-25T14:43:15+0800
     * @param    mixed                    $value [description]
     * @param    string                   $rule  [description]
     * @param    string                   $data  [description]
     * @param    string                   $field [description]
     * @return   boolean                         [description]
     */
    protected function isNotEmpty($value, $rule='', $data='', $field='') {
        if (empty($value) && ($value !== '0' && $value !== 0)) {
            return $field . '不允许为空';
        } else {
            return true;
        }
    }

    /**
     * 用户电话电话号码验证
     * @Author   zhua
     * @DateTime 2018-08-25T14:41:01+0800
     * @param    str                 $mobile 需要检测的电话号码
     * @return   boolean
     */
    protected function isMobile($mobile) {
        $rule = '^1(3|4|5|6|7|8|9)[0-9]\d{8}$^';
        $result = preg_match($rule, $mobile);
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

    /*
     * 是否为数组
     * @Author   lyj
     * @param    array                 $ids 需要检测的数组
     * @return   boolean
     */
    protected function isArray($ids) {
        if(!is_array($ids)) return false;
        if(empty(array_filter($ids))) return false;
        return true;
    }

    protected function captchaCheck($value, $id='') {
        $captcha = new \think\captcha\Captcha((array) Config::get('captcha.'));
        return $captcha->check($value, $id);
    }

    public function getIds($field = 'ids')
    {
        $ids = request()->param($field);
        preg_match_all("{$this->regex['ids']}", $ids, $matchs);

        $ids = array_map(function ($id){
            return trim(str_replace(',', '', $id));
        }, $matchs[1]);

        return $ids;
    }

    /**
     * 检查指定字符串是否为日期格式 年-月-日
     * @param $date  日期字符串
     * @return bool  true 是日期格式     false 不是日期格式
     */
    public function isDate($date)
    {
        //匹配日期格式
        if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts))
        {
            //检测是否为日期,checkdate为月日年
            if(checkdate($parts[2],$parts[3],$parts[1]))
                return true;
            else
                return false;
        }
        else
            return false;
    }
}